package model;

import java.util.*;

import javax.swing.JLabel;

import Observer.Observable;

import vue.ObserveurPlateau;

/**
 * Class Plateau
 */
public class Plateau extends Observable<List<Case>, ObserveurPlateau> {

	//
	// Fields
	//

	private Case[][] cases;
	private ArrayList<Case> creation;
	private ArrayList<Case> cible;
	private Case position;
	private int x, y;
	private boolean tour= true;

	//
	// Constructors
	//
	public Plateau(){
		
		this(8,8);
	}
	
	public Plateau(int x, int y) {
		cases = new Case[x][y];
		this.setX(x);
		this.y=y;
		creation = new ArrayList<Case>();
		for (int i=0; i<8; i++) {
			for (int j=0; j<8; j++) {
				cases[j][i] = new Case(j, i, this);
				creation.add(cases[j][i]);
			}
		}
	}
	
	public void signaleCration() {
		notifier(creation);
		creation=null;
	}
	
		
	
	/** // la méthode moveTo bouge la pièce vers la case destination c si
     * le déplacement est valide
     * puis elle mets à jour la variable tour 
     * afin de permettre à l'autre joueur de jouer
     */
    public void moveTo(Case c){
		ArrayList<Case> modification = new ArrayList<Case>();
		modification.add(position);
		modification.add(c);
    	Personnage perso= position.getPerso();
   		position.setSelectionner(false);
   		position.setPerso(null);
    	position=c;
    	perso.setPosition(c);
    	c.setPerso(perso);
    	clearSelect();
    	notifier(modification);
    }


	//
	// Methods
	//

	//
	// Accessor methods
	//

	public void clearSelect() {
		ArrayList<Case> modification = new ArrayList<Case>();
   		position.setSelectionner(false);
   		modification.add(position);
    	position=null;
    	for(Case laCase: cible) {
    		laCase.setCible(false);
    		modification.add(laCase);
    	}
    	notifier(modification);
	}

	/**
	 * Set the value of cases
	 * 
	 * @param newVar
	 *            the new value of cases
	 */
	public void setCases(Case[][] newVar) {
		cases = newVar;
	}

	/**
	 * Get the value of cases
	 * 
	 * @return the value of cases
	 */
	public Case[][] getCases() {
		return cases;
	}
	
	public void setSelectionner(int x, int y, boolean attaquer) {
		ArrayList<Case> modification = new ArrayList<Case>();
		if (cible!=null)
			for (Case laCase: cible) {
				laCase.setCible(false);
				modification.add(laCase);
			}
		cible = new ArrayList<Case>();
		if (position != null) {
			position.setSelectionner(false);
			modification.add(position);
		}
		position = getCases()[x][y];
		position.setSelectionner(true);
		modification.add(position);
		if (position.getPerso() != null) {
			if (attaquer) {
				for (Case laCase : position.getPerso().getCaseAttaquable()) {
					if (laCase!=null) {
						laCase.setCible(true);
						modification.add(laCase);
						cible.add(laCase);
					}
				}
			} else {
				for (Case laCase : position.getPerso().getCaseAccessible()) {
					if (laCase!=null) {
						laCase.setCible(true);
						modification.add(laCase);
						cible.add(laCase);
					}
				}
			}
		}
		notifier(modification);
	}

	public Case getPosition() {
		return position;
	}

	public void setPosition(Case position) {
		this.position = position;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public void notifier(Case case1) {
		ArrayList<Case> mod = new ArrayList<Case>();
		mod.add(case1);
		notifier(mod);
	}

	//
	// Other methods
	//

}
